<?php 
	/**
	* PDO连接MySQL数据库，PDO的效率并不是很高，所以要是追求效率的话请使用mysqli
	*/
	class DB_PDO_Class{
		public static $config = array(); //设置连接参数
		public static $link = null; //保存对象
		public static $pconnect=false; //是否支持长连接
		public static $dbVersion=null; //保存数据库版本
		public static $connected=false; //是否连接成功
		public static $PDOStatement=null; //保存PDOStatement对象	 
		public static $queryStr=null;  //保存最后执行的操作
		public static $error=null;   //保存错误信息



		public function __construct($dbConfig=''){
			if (!class_exists("PDO")) {
				self::throw_exception("不支持PDO，请先开启");
			}
			if (is_array($dbConfig)) {
				$dbConfig=array(
					'hostname' => DB_HOST,
					'username' => DB_USER,
					'password' => DB_PWD,
					'database'  =>  DB_NAME,
					'hostport'   =>   DB_PORT,
					'dbms'	      => DB_TYPE,
					'dsn'          => DB_TYPE . ":host=" . DB_HOST . ";dbname=" . DB_NAME    
				);
			}
			if (empty($dbConfig['hostname'])) self::throw_exception('没有定义数据库配置，请定义');
			self::$config = $dbConfig;
			if (empty(self::$config['params'])) self::$config['params'] = array();
			if (!isset(self::$link)) {
				$configs = self::$config;
				if (self::$pconnect) {
					//开启长连接，添加到配置数组中。
					$configs['params'][constant("PDO::ATTR_PERSISTENT")] = true;
				}
				try{
					self::$link = new PDO($configs['dsn'],$configs['username'],$configs['password'],$configs['params']);
				}catch(PDOException $e){
					self::throw_exception($e->getMessage());
				}
				if (!self::$link) {
					self::throw_exception('PDO连接错误');
					return false;
				}
				self::$link->exec('SET NAMES' . DB_CHARSET);
				self::$dbVersion=self::$link->getAttribute(constant("PDO::ATTR_SERVER_VERSION"));
				self::$connected=true;
				unset($configs);
			}
		}

		//获得所有
		public static function getAll($sql=null){
			if ($sql != null) {
				sql::query($sql);
			}
			$result=self::$PDOStatement->fetchAll(constant("PDO::FETCH_ASSOC"));
			return $result;
		}


		//释放
		public static function free(){
			self::$PDOStatement=null;
		}

		//查询
		public static function query($sql=''){
			$link=self::$link;
			if (!$link) return false;
			//判断之前是否有结结果集，有的话释放
			if (!empty(self::$PDOStatement))  self::free();
			self::$queryStr=$sql;
			self::$PDOStatement=$link->prerare(self::$queryStr);
			$res = self::$PDOStatement=$link->execute();
			self::haveErrorThrowException();
			return $res;

		}

		//错误信息处理
		public static function haveErrorThrowException(){
			$obj = empty(self::PDOStatement) ? self::$link : self::$PDOStatement;
			$arrError = $obj->errorInfo();
			if ($arrError[0] != '00000') {
				self::$error='SQLSTATE' . $arrError[0] . 'SQL Error' . $arrError[2] . '<br />Error SQL' . self::$queryStr;
				self::throw_exception(self::$error);
				return false;
			}
			if (self::$queryStr == '') {
				self::throw_exception('没有执行SQL语句');
				return false;
			}
		}


		//自定义错误处理
		public static function throw_exception($errorMsg){
			echo '<div style="width:80%;background-color:#ABCDEF;color:black;font-size:20px;padding:20px 0px;>' .
				$errorMsg
			. '</div>';
		}
	}